package com.csw.sql


import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

object Demo01SparkSess {
  def main(args: Array[String]): Unit = {

    /**
      * SparkSession: spark 2.0提供的新的入口
      *
      * 新版本的统一入口
      */

    val spark: SparkSession = SparkSession
      .builder()
      .master("local")

      //指定spark sql shuffle 之后df的分区的数量，默认为200
      .config("spark.sql.shuffle.partitions", 2)
      .appName("sparkSession")
      .getOrCreate()

    //获取sparkContext
    //    val sc: SparkContext = spark.sparkContext

    /**
      * DataFrame：在RDD的基础上增加了列名
      * 相当于一张表
      */

    //spark  sql 读取数据的方式
    val studentDF: DataFrame = spark.read.json("spark/data/students.json")

    //查看表结构
    studentDF.printSchema()

    /**
      * show：查看数据，相当于action算子
      */
    studentDF.show() //默认显示20条
    //    studentDF.show(100) //查看100条数据
    //    studentDF.show(false) //完整显示数据

    /**
      * DSL语句：类sql语句，介于sql和代码中间的api
      */

    studentDF
      .where("age > 22")
      .select("id")
      .show()

    //统计班级的人数
    studentDF
      .groupBy("clazz")
      .count()
      .show()

    /**
      * 创建临时试图
      *
      */
    val student: Unit = studentDF.createOrReplaceTempView("student")

    /**
      * 通过spark 编写sql，返回一个新的DataFrame
      */

    val clazzCount: DataFrame = spark.sql(
      """
        |select clazz,count(1) as countClazz
        |from student
        |group by clazz
      """.stripMargin)

    /**
      * 保存数据
      *
      */
    clazzCount
      .write
      .mode(SaveMode.Overwrite)//如果输出目录已经存在就覆盖
      .json("spark/data/clazz_count")
  }
}
